import pandas as pd
import os
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

# 获取当前脚本的目录
script_dir = os.path.dirname(os.path.abspath(__file__))

# 构造相对路径
# 数据已经按照时间升序排序，同时也已经根据时间切分出训练集和测试集（训练集 2011/1/1 至 2012/10/1 ； 测试集 从2012/10/1 至 2012/12/31）
data_path = os.path.join(script_dir, '..', 'dataset', 'train_data.csv') # 需要归一化的数据已经归一化了

# 加载数据
data = pd.read_csv(data_path)

# 确保保存图像的目录存在
images_dir = os.path.join(script_dir, '..', 'images')
os.makedirs(images_dir, exist_ok=True)

# 绘制目标变量分布
plt.figure(figsize=(10, 6))  # 设置图像大小
sns.histplot(data['cnt'], kde=True, color='skyblue', bins=30)
plt.title("Target Variable Distribution", fontsize=16, weight="bold")
plt.xlabel("Count", fontsize=12)
plt.ylabel("Frequency", fontsize=12)
# 保存图像
hist_path = os.path.join(images_dir, 'target_variable_distribution.png')
plt.savefig(hist_path, dpi=300, bbox_inches='tight')  # 设置分辨率和边界
plt.show()

# 计算相关性矩阵
numeric_data = data.select_dtypes(include=['number'])  # 只保留数值型列
features = numeric_data.drop(columns=['casual', 'registered'])  # 移除这两个变量
correlation_matrix = features.corr()

# 可视化相关性矩阵
plt.figure(figsize=(12, 10))  # 设置图像大小
sns.set(font_scale=0.8)  # 调整字体大小
sns.heatmap(
    correlation_matrix,
    annot=True,
    fmt=".2f",  # 保留两位小数
    cmap="coolwarm",
    linewidths=0.5,
    cbar_kws={'shrink': 0.8},  # 缩小颜色条
    # mask=np.triu(correlation_matrix)  # 屏蔽对角线以上部分
)
plt.title("Correlation Matrix", fontsize=16, weight="bold")
# 保存热力图
heatmap_path = os.path.join(images_dir, 'correlation_heatmap.png')
plt.savefig(heatmap_path, dpi=300, bbox_inches='tight')  # 设置分辨率和边界
plt.show()

# 查看数据结构
print("Data Info:")
data.info()
print("\nData Head:\n", data.head())
# 数据描述统计
print("\nData Describe:\n", data.describe())  # 无异常值
# 检查缺失值
missing_values = data.isnull().sum()
print("\nData Missing Values:\n", missing_values)  # 无缺失值
# 找到包含缺失值的行
rows_with_missing_values = data[data.isnull().any(axis=1)]
# 打印含缺失值的行
print("\nData Rows with Missing Values:\n", rows_with_missing_values)